package service

import (
	"errors"
	"fmt"
	"im_unitree/model"
	. "im_unitree/utils"
	"math/rand"
	"time"
)

type UserService struct {
}

// 注册函数
func (s *UserService) Register(
	mobile, // 手机号
	plain_passwd, // 明文密码
	nickname, // 昵称
	avatar,
	sex,
	memo string) (user model.User, err error) {
	fmt.Println("检查传入的数据")
	fmt.Println("mobile", mobile)
	fmt.Println("plain_passwd", plain_passwd)
	fmt.Println("nickname", nickname)
	fmt.Println("avatar", mobile)
	fmt.Println("memo", memo)
	fmt.Println("检查完毕")

	// 检测手机号是否存在数据库  我们认为一个手机号对应一个账号
	tmp := model.User{}
	_, err = DbEngin.Where("mobile=?", mobile).Get(&tmp)
	if err != nil {
		return tmp, err
	}
	// 如果存在则返回提示已经注册
	if tmp.Id > 0 {
		return tmp, errors.New("该手机号已经注册，请直接登录")
	}
	// 否则拼接插入数据
	tmp.Mobile = mobile
	tmp.Sex = sex
	tmp.Avatar = avatar
	tmp.Nickname = nickname
	tmp.Memo = memo
	tmp.Salt = fmt.Sprintf("%06d", rand.Int31n(10000))
	tmp.Passwd = MakePasswd(plain_passwd, tmp.Salt)
	tmp.Createat = time.Now()

	// 插入数据库
	_, err = DbEngin.InsertOne(&tmp)
	return tmp, err
}

// 登录函数
func (s *UserService) Login(
	mobile, // 手机号
	plain_passwd string) (user model.User, err error) {

	fmt.Println("mobile:", mobile)
	fmt.Println("plain_passwd:", plain_passwd)
	// 首先查看一个是否有这个手机号
	tmp := model.User{}
	fmt.Println("here===========")
	_, err = DbEngin.Where("mobile=?", mobile).Get(&tmp)
	fmt.Println("here2===========")
	if err != nil {
		return tmp, err
	}
	if tmp.Id == 0 { // 没有注册
		return tmp, errors.New("该手机号没有注册，请先注册")
	}

	// 如果没有这个手机号，我们提示用户注册
	// 如果存在则返回提示已经注册

	// 如果有这个手机号，我们执行校验，首先从数据库中取到加盐密码
	if !ValidatePasswd(plain_passwd, tmp.Salt, tmp.Passwd) { // 登录失败
		return tmp, errors.New("密码不正确，请重新登录")
	}
	//刷新token,安全
	str := fmt.Sprintf("%d", time.Now().Unix())
	token := MD5Encode(str)
	tmp.Token = token
	//返回数据
	_, err = DbEngin.ID(tmp.Id).Cols("token").Update(&tmp)
	return tmp, err
}

// 根据userid查找某个用户
func (s *UserService) Find(
	userId int64) (user model.User) {
	tmp := model.User{}
	DbEngin.ID(userId).Get(&tmp)

	return tmp
}
